package com.opengate.base.stream;

import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.support.MessageBuilder;

import java.io.Serializable;

/**
 * @author 曳戈泰尔
 * @version 1.0
 * @description Spring Cloud stream 基础消息体，所有消息体都需要继承此类
 * @date 2023/4/26 5:46 PM
 */
@Data
@Slf4j
@Accessors(chain = true)
public class BaseMessage implements Serializable {

    /**
     * 发送消息 广播消息
     *
     * @param source 消息发送源
     * @return 是否发送成功
     */
    public boolean send(Source source) {

        // 获取当前类名
        String type = this.getClass().getSimpleName();

        // 打印日志
        log.warn("SEND Message: {}，{}", this.getClass().getSimpleName(), JSON.toJSONString(this));

        // 发送消息
        return source.output()
                .send(MessageBuilder.withPayload(this).setHeader("type", type).build());
    }

    /**
     * 发送延迟消息 广播消息
     *
     * @param source 消息发送源
     * @param delaySecond 延迟时间，单位秒
     * @return 是否发送成功
     */
    public boolean sendDelay(Source source, long delaySecond) {

        // 获取当前类名
        String type = this.getClass().getSimpleName();

        // 打印日志
        log.warn("SEND Message: {}，{}", this.getClass().getSimpleName(), JSON.toJSONString(this));

        // 发送消息
        return source.output()
                .send(
                        MessageBuilder.withPayload(this)
                                .setHeader("type", type)
                                .setHeader("x-delay", delaySecond)
                                .build());
    }

    /**
     * 发送消息 单播消息
     *
     * @param repOutput 消息发送源
     * @return 是否发送成功
     */
    public boolean send(RepOutput repOutput) {

        // 获取当前类名
        String type = this.getClass().getSimpleName();

        // 打印日志
        log.warn("SEND Message: {}，{}", this.getClass().getSimpleName(), JSON.toJSONString(this));

        // 发送消息
        return repOutput
                .output()
                .send(MessageBuilder.withPayload(this).setHeader("type", type).build());
    }

    /**
     * 发送延迟消息 单播消息
     *
     * @param repOutput 消息发送源
     * @param delaySecond 延迟时间，单位秒
     * @return 是否发送成功
     */
    public boolean sendDelay(RepOutput repOutput, long delaySecond) {

        // 获取当前类名
        String type = this.getClass().getSimpleName();

        // 打印日志
        log.warn("SEND Message: {}，{}", this.getClass().getSimpleName(), JSON.toJSONString(this));

        // 发送消息
        return repOutput
                .output()
                .send(
                        MessageBuilder.withPayload(this)
                                .setHeader("type", type)
                                .setHeader("x-delay", delaySecond)
                                .build());
    }
}
